from loguru import logger as __loguru_logger
from pathlib import Path
import sys
"""
提供loguru.logger的初始化, 在main函数初始化后直接使用loguru.logger即可, 主要特性如下:
1) 日志分隔: log.info记录所有日志, log.warn只记录warning级别以上的日志
2) 支持设置日志切割和最长保留天数
3) 支持日志输出到控制台
"""

project_path = Path.cwd()  # 项目路径
log_path = Path(project_path, "log")  # 日志路径

logger = __loguru_logger


def init_loguru_logger(quiet=False, rotation="00:00", level="INFO", retention="10 days"):
    """初始化项目日志
    Args:
        quiet: True时不打印日志到控制台
        rotation: info日志切割, "500 MB"表示每500M就自动切割, "00:00"表示每天零点自动切割
        level: 写入info日志的级别, 如果想打印debug日志设置参数为"DEBUG"
        retention: 日志保留时长
    """
    # 支持带时间戳的文件名, 这里只精确到天
    info_file_path = Path(log_path, 'log.info.{time:YYYY-MM-DD}')
    wf_file_path = Path(log_path, 'log.warn.{time:YYYY-MM-DD}')

    # loguru默认会输出日志到控制台, 需要先remove掉再重新设置
    logger.remove()
    if not quiet:
        logger.add(sys.stderr,
                   colorize=True,
                   format="[<green>{time:YYYY-MM-DDTHH:mm:ss}</green>]<level>{message}</level>",
                   level="WARNING")

    logger.add(
        info_file_path,
        enqueue=True,  # 异步写入日志, 保障线程安全
        backtrace=True,
        diagnose=True,  # 显示整个堆栈跟踪（包括变量值）
        format='[{level:^7}][{time:hh:mm:ss}][{file}:{line}]{message}',
        rotation=rotation,
        retention=retention,
        level=level,
        encoding="utf-8",  # 支持中文
    )
    logger.add(wf_file_path,
               enqueue=True,
               backtrace=True,
               diagnose=True,
               format='[{level:^7}][{time:hh:mm:ss}][{file}:{line}]{message}',
               rotation=rotation,
               retention=retention,
               encoding="utf-8",
               level="WARNING")


def init_console_logger(log_level="INFO"):
    """初始化控制台日志, 用于脚本
    """
    # loguru默认会输出日志到控制台, 需要先remove掉再重新设置, 否则会重复打印日志
    logger.remove()
    logger.add(sys.stdout,
               colorize=True,
               format="[<green>{time:YYYY-MM-DDTHH:mm:ss}</green>]<level>{message}</level>",
               level=log_level)


# 以下是示例用法
if __name__ == "__main__":
    # init_loguru_logger()
    init_console_logger()

    # 支持控制日志级别
    logger.debug("this is a debug message")
    logger.info("this is a info message")
    logger.warning("this is a warning message")
    logger.error("this is a error message")
    # 支持f-string
    logger.info('If you are using Python {}, prefer {feature} of course!', 3.6, feature='f-strings')
